package kr.hkit.powerjava.chapter12;

import java.util.Arrays;
import java.util.Comparator;


class Student /*implements Comparable<Student>*/ { //비교할 대상 적기 <>이안에. 안적으면 object로 받음
	private String stdName;
	private double gpa;
	
	
	public Student(String stdName, double gpa) {
		this.stdName = stdName;
		this.gpa = gpa;
	}

	public String getStdName() {
		return stdName;
	}

	public double getGpa() {
		return gpa;
	}

	@Override
	public String toString() {
		return String.format("[%s, %s]", stdName, gpa);
	}

/*	@Override
	public int compareTo(Student o) {
		return (int) (this.gpa - o.gpa); //평점가지고 비교하겠다. 
	} // 이거 해주고나면 평점순으로 자동정렬됩니다. (오름차순)
	*/
}


public class Sorttest {
	public static void main(String[] args) {
		
		int[] arr = {5,6,7,8,1,2,3,4};
		
		prnArr(arr);
		
		Arrays.sort(arr); //자동 정렬하는 거!!!!
		prnArr(arr);
		
		Student[] arrStd = new Student[4];
		arrStd[0] = new Student("홍길동", 3.3);
		arrStd[1] = new Student("임꺽정", 4.4);
		arrStd[2] = new Student("황진이", 2.6);
		arrStd[3] = new Student("김태희", 1.7);
		
//		prnArr(arrStd); //타입이 틀리니까 오버로딩!!! 매개변수의 타입 다름
		
//		Arrays.sort(arrStd); // 뭘로 비교할지 정해져 있지 않음.comparable 구현해야함
		
		
		//이름 순 정렬하기
		Comparator<Student> compName = new Comparator<Student>() {
			@Override 
			public int compare(Student o1, Student o2) { 
				return o1.getStdName().hashCode() - o2.getStdName().hashCode();
			} // hashcode 글자를 숫자로 바꾸는. 'A'는 65의 65가 해시코드
		};

		//평점순 정렬 (이거 많이쓰입니다!!) 알아두십셔 
		Comparator<Student> CompGpa = new Comparator<Student>() {
			@Override
			public int compare(Student o1, Student o2) {
				return (int) (o1.getGpa()*10-o2.getGpa()*10);
			} //10 곱해서 양수로
		};
		
		
		Arrays.sort(arrStd, compName);
		prnArr(arrStd);

		Arrays.sort(arrStd, CompGpa);
		prnArr(arrStd);

	}
	


	private static void prnArr(Student[] arrStd) {
		for (Student s : arrStd) {
			System.out.print(s + "\t");
		}
		System.out.println();
	}

	private static void prnArr(int[] arr) {
		for (int e:arr) {
			System.out.printf("%2d", e);
		}
		System.out.println();
	}
}
